package air.jason.com.porterduffxfermodetest.view;

import android.content.Context;
import android.graphics.AvoidXfermode;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

import air.jason.com.porterduffxfermodetest.R;

/**
 * @DESC:   AvoidXfermode的使用
 * @Author: Jason
 * @Date: 16/8/23
 * @Time: 22:17
 */


/**
 * AvoidXfermode只有一个含参的构造方法
 *      AvoidXfermode(int opColor, int tolerance, AvoidXfermode.Mode mode)
 *      1.opColor表示一个16进制的可以带透明通道的颜色值例如0x12345678
 *      2.第二个参数tolerance表示容差值
 *      3.最后一个参数表示AvoidXfermode的具体模式，
 *        其可选值只有两个：AvoidXfermode.Mode.AVOID或者AvoidXfermode.Mode.TARGET
 *
 *      a:AvoidXfermode.Mode.TARGET
 *          在该模式下Android会判断画布上的颜色是否会有跟opColor不一样的颜色，比如我opColor是红色，
 *          那么在TARGET模式下就会去判断我们的画布上是否有存在红色的地方，如果有，
 *          则把该区域“染”上一层我们画笔定义的颜色，否则不“染”色，
 *          而tolerance容差值则表示画布上的像素和我们定义的红色之间的差别该是多少的时候才去“染”的，
 *          比如当前画布有一个像素的色值是(200, 20, 13)，而我们的红色值为(255, 0, 0)，
 *          当tolerance容差值为255时，即便(200, 20, 13)并不等于红色值也会被“染”色，
 *          容差值越大“染”色范围越广反之则反.
 *
 *      b:AvoidXfermode.Mode.AVOID
 *          则与TARGET恰恰相反，TARGET是我们指定的颜色是否与画布的颜色一样，
 *          而AVOID是我们指定的颜色是否与画布不一样，其他的都与TARGET类似
 *          AvoidXfermode(0XFFFFFFFF, 0, AvoidXfermode.Mode.AVOID)：当模式为AVOID容差值为0时，只有当图片中像素颜色值与0XFFFFFFFF完全不一样的地方才会被染色
 *          AvoidXfermode(0XFFFFFFFF, 255, AvoidXfermode.Mode.AVOID)：当容差值为255时，只要与0XFFFFFFFF稍微有点不一样的地方就会被染色
 *
 *
 *      那么这玩意究竟有什么用呢？比如说当我们只想在白色的区域画点东西或者想把白色区域的地方替换为另一张图片的时候就可以采取这种方式！
 */

public class AvoidXfermodeView extends View {

    private Paint mPaint; // 画笔
    private Context mContext;
    private Bitmap mBitmap;
    private AvoidXfermode mAvoidXfermode;
    private int x,y,w,h; // 位图绘制时左上角的起点坐标


    public AvoidXfermodeView(Context context) {
        this(context, null);
    }

    public AvoidXfermodeView(Context context, AttributeSet attrs) {
        super(context, attrs);


        initData(context);


    }

    private void initData(Context context) {
        // 初始化画笔
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        // 当画布中有跟0XFFFFFFFF色不一样的地方的时候才染色
        mAvoidXfermode = new AvoidXfermode(0xFFFFFFFF, 0, AvoidXfermode.Mode.TARGET);

        mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.a);
        /*
         * 计算位图绘制时左上角的坐标 使其位于屏幕中心
         * 屏幕坐标x轴向左偏移位图一半的宽度
         * 屏幕坐标y轴向上偏移位图一半的高度
         */
        int width = context.getResources().getDisplayMetrics().widthPixels;
        int height = context.getResources().getDisplayMetrics().heightPixels;
        x = width / 2 - mBitmap.getWidth() / 2;
        y = height / 2 - mBitmap.getHeight() / 2;
        w = width / 2 + mBitmap.getWidth() / 2;
        h = height / 2 + mBitmap.getHeight() / 2;

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 先绘制位图
        canvas.drawBitmap(mBitmap, x, y, mPaint);

        // 决定染什么色
        mPaint.setARGB(255, 211, 53, 243);

        // 设置模式
        mPaint.setXfermode(mAvoidXfermode);

        // 画一个位图大小一样的矩形
        canvas.drawRect(x, y, w, h, mPaint);
    }
}
